class PubSub {
  constructor() {
    // 订阅器--存储订阅的事件和相应的回调函数
    this.subscriber = {};
  }

  // 订阅事件 --- 注意：相同的事件名可能有多个不同的回调函数
  subscribe(eventName, callback) {
    if (!this.subscriber[eventName]) {
      this.subscriber[eventName] = [];
    }
    this.subscriber[eventName].push(callback);
  }

  // 取消订阅 -- 取消某个事件的函数
  unsubscribe(eventName, callback) {
    if (this.subscriber[eventName]) {
      this.subscriber[eventName].filter(item => item !== callback);
    }
  }

  // 发布事件 --- 执行订阅器里面的相应回调函数
  publish(eventName, data) {
    if (this.subscriber[eventName]) {
      this.subscriber[eventName].forEach(callback => {
        callback(data);
      });
    }
  }
}

// 测试
const pubsub = new PubSub();
pubsub.subscribe('myEvent', data => console.log('Received data:', data));
pubsub.publish('myEvent', 'Hello, world!');
pubsub.unsubscribe('myEvent', (data) => console.log('Receiveddata:', data));
pubsub.publish('myEvent', 'Hello, world two!');

